package com.iking.toolkit.formatdeal.service.impl;

import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import com.alibaba.fastjson.JSON;
import com.iking.toolkit.model.Msg;
import com.iking.toolkit.formatdeal.model.dto.WebDealDTO;
import com.iking.toolkit.formatdeal.service.WebsiteService;
import com.iking.toolkit.redis.RedisObjectService;
import com.iking.toolkit.system.dao.DictionaryItemsMapper;
import com.iking.toolkit.system.model.model.DictionaryItems;
import com.iking.toolkit.util.ApiUrlUtil;
import io.jsonwebtoken.io.IOException;
import jakarta.servlet.http.HttpServletResponse;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;

/**
 * 功能描述:网页处理接口管理
 *
 * @author: yfl
 * @date: 2025/8/4 13:38
 */
@Service
public class WebsiteServiceImpl implements WebsiteService {
    @Autowired
    private ApiUrlUtil apiUrlUtil;

    /**
     * 功能描述: 网页转pdf
     *
     * @param: [webDealDTO]
     * @author: yfl
     * @date: 2025/8/4 13:44
     */
    @Override
    public Msg webToPdf(WebDealDTO webDealDTO, HttpServletResponse response) {
        String webApiUrl = apiUrlUtil.getOcrApiUrl();
        if (StringUtils.isBlank(webApiUrl)) {
            // 错误处理：返回JSON提示
            return Msg.fail("ocrApiUrl参数未配置!");
        }
        // 构建JSON参数（而非form表单）
        HashMap<String, Object> paramMap = new HashMap<>();
        paramMap.put("url", webDealDTO.getUrl());
        String jsonParam = JSON.toJSONString(paramMap);  // 转为JSON字符串
        // 发送POST请求，指定Content-Type为application/json
        byte[] pdfBytes = null;
        try (HttpResponse httpResponse = HttpRequest.post(webApiUrl + "/api/web_to_pdf")
                .body(jsonParam)  // 发送JSON字符串
                .header("Content-Type", "application/json")  // 关键：指定JSON格式
                .timeout(30000)
                .execute()) {

            if (!httpResponse.isOk()) {
                return Msg.fail("网页转pdf失败，状态码：" + httpResponse.getStatus());
            }
            pdfBytes = httpResponse.bodyBytes();
        } catch (IOException e) {
            return Msg.fail("请求异常：" + e.getMessage());
        }
        // 关键改进2：设置响应头，让前端识别为文件并下载
        try {
            // 设置文件类型（PDF）
            response.setContentType("application/pdf");
            // 生成文件名（带时间戳避免重复）
            String fileName = "网页转PDF_" + System.currentTimeMillis() + ".pdf";
            // 处理中文文件名乱码
            String encodedFileName = URLEncoder.encode(fileName, StandardCharsets.UTF_8.name());
            // 告诉浏览器以附件形式下载
            response.setHeader("Content-Disposition",
                    "attachment; filename=\"" + encodedFileName + "\"; filename*=UTF-8''" + encodedFileName);
            // 设置文件大小
            response.setContentLength(pdfBytes.length);

            // 关键改进3：将文件流写入响应体
            try (OutputStream os = response.getOutputStream()) {
                os.write(pdfBytes);
                os.flush();  // 确保所有数据写出
            }
        } catch (IOException e) {
            return Msg.fail("文件返回失败：" + e.getMessage());
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException(e);
        } catch (java.io.IOException e) {
            throw new RuntimeException(e);
        }
        // 无需返回Msg对象，文件流已通过response写出
        return null;
    }

    /**
     * 功能描述: 网页转png
     *
     * @param: [webDealDTO, response]
     * @author: yfl
     * @date: 2025/8/4 14:28
     */
    @Override
    public Msg webToPng(WebDealDTO webDealDTO, HttpServletResponse response) {
        String webApiUrl = apiUrlUtil.getOcrApiUrl();
        if (StringUtils.isBlank(webApiUrl)) {
            // 错误处理：返回JSON提示
            return Msg.fail("ocrApiUrl参数未配置!");
        }
        // 构建JSON参数（而非form表单）
        HashMap<String, Object> paramMap = new HashMap<>();
        paramMap.put("url", webDealDTO.getUrl());
        String jsonParam = JSON.toJSONString(paramMap);  // 转为JSON字符串
        // 发送POST请求，指定Content-Type为application/json
        byte[] pdfBytes = null;
        try (HttpResponse httpResponse = HttpRequest.post(webApiUrl + "/api/web_to_png")
                .body(jsonParam)  // 发送JSON字符串
                .header("Content-Type", "application/json")  // 关键：指定JSON格式
                .timeout(30000)
                .execute()) {

            if (!httpResponse.isOk()) {
                return Msg.fail("网页转png失败，状态码：" + httpResponse.getStatus());
            }
            pdfBytes = httpResponse.bodyBytes();
        } catch (IOException e) {
            return Msg.fail("请求异常：" + e.getMessage());
        }
        // 关键改进2：设置响应头，让前端识别为文件并下载
        try {
            // 设置文件类型
            response.setContentType("application/png");
            // 生成文件名（带时间戳避免重复）
            String fileName = "网页转png_" + System.currentTimeMillis() + ".png";
            // 处理中文文件名乱码
            String encodedFileName = URLEncoder.encode(fileName, StandardCharsets.UTF_8.name());
            // 告诉浏览器以附件形式下载
            response.setHeader("Content-Disposition",
                    "attachment; filename=\"" + encodedFileName + "\"; filename*=UTF-8''" + encodedFileName);
            // 设置文件大小
            response.setContentLength(pdfBytes.length);

            // 关键改进3：将文件流写入响应体
            try (OutputStream os = response.getOutputStream()) {
                os.write(pdfBytes);
                os.flush();  // 确保所有数据写出
            }
        } catch (IOException e) {
            return Msg.fail("文件返回失败：" + e.getMessage());
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException(e);
        } catch (java.io.IOException e) {
            throw new RuntimeException(e);
        }
        // 无需返回Msg对象，文件流已通过response写出
        return null;
    }


}
